//
//  SQLiteDataBaseManager.m
//  18-SQLite
//
//  Created by dllo on 16/8/8.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import "SQLiteDataBaseManager.h"
#import "Student.h"

@implementation SQLiteDataBaseManager
//单利创建方式，单利不能被释放内存管理中
+ (SQLiteDataBaseManager *)shareManager
{
    static SQLiteDataBaseManager *manager = nil;
//    dispatch_once_t onceToKen;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[SQLiteDataBaseManager alloc] init];
    });
    return manager;
}

- (BOOL)openSQLite3{
    NSArray *pathArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ;
    NSString *document = [pathArr firstObject];
//    数据库的后缀.db
    NSString *dbPath = [document stringByAppendingPathComponent:@"student.db"];
    NSLog(@"%@",dbPath);
//    UTF8Stringoc字符串转为c语言
    /**
     *  数据库文件路径
     *指向指针的指针 ，该指针可以被修改,数据库管理指针
     */
    int result =  sqlite3_open([dbPath UTF8String], &dbPoint);
//    BOOL isOpen = YES;
////    sqlite3_open当路径不存在时，文件会被sqlite创建并打开， 存在时，文件被直接打开
////    sqlite3_open返回值为int0  SQLITE_OK代表成功，1代表失败
//    if (result == SQLITE_OK) {
//        NSLog(@"数据库打开成功");
//        isOpen = YES;
//    } else {
//         NSLog(@"数据库打开失败----%d",result);
//        isOpen = NO;
//    }
//    
//    return isOpen;
    return [self isOperationResult:result alertText:@"打开"];
}
- (BOOL)closeSQLite3{
    
//    int isClose = YES;
//    关闭数据时，如果数据库处于打开状态，正常关闭，显示成功
//    如果数据库处于关闭状态，则失败，原因21 库不存在
    int result =sqlite3_close(dbPoint);
//    BOOL isClose = YES;
//    //    sqlite3_open当路径不存在时，文件会被sqlite创建并打开， 存在时，文件被直接打开
//    //    sqlite3_open返回值为int0  SQLITE_OK代表成功，1代表失败
//    if (result == SQLITE_OK) {
//        NSLog(@"数据库关闭成功");
//        isClose = YES;
//    } else {
//        NSLog(@"数据库关闭失败----%d",result);
//        isClose = NO;
//    }

    return [self isOperationResult:result alertText:@"打开数据库"];
    
//    return isClose;
}

- (BOOL)isOperationResult:(int)result alertText:(NSString *)text {
    BOOL isOperation = YES;
//    int result =sqlite3_close(dbPoint);
//    BOOL isClose = YES;
    //    sqlite3_open当路径不存在时，文件会被sqlite创建并打开， 存在时，文件被直接打开
    //    sqlite3_open返回值为int0  SQLITE_OK代表成功，1代表失败
    if (result == SQLITE_OK) {
        NSLog(@"数据库%@成功", text);
        isOperation = YES;
    } else {
        NSLog(@"数据库%@失败----%d",text,result);
        isOperation = NO;
    }
    return isOperation;
}

- (BOOL)createSQLite
{
//    sql语句
//    创建表
//    create table表名（字段1 类型 约束，字段2，字段3....）
    
    
//    NSString *createSQL = @"create table stu(stu_id integer primary key,stu_name text)";
//    primary key一个表，有且只能有一个主键
//    autoincrement自增，添加完该字段，会创建一个数据库，sqlite_sequence用来保存自增的值
//    not null 不能为空，为空会报SQL错误
    
//    删除表
//    SQL 语句drop table stu(表名)
        NSString *createSQL = @"create table stu2 (stu_id integer primary key autoincrement,stu_name text not null)";
    int result = sqlite3_exec(dbPoint, [createSQL UTF8String], NULL, NULL, NULL);
    
    return [self isOperationResult:result alertText:@"创建表"];
}

- (BOOL)insertStu:(Student *)stu
{
    NSString *insertSQL = [NSString stringWithFormat:@"insert into stu2 values (%@, '%@')",NULL, stu.stu_name];
    
//    自增字段，默认填入空值，值从1开始，填入其他值从其他值开始例：110，并进行存储在sqlite_sequence
//    NSString *insertSQL = @"insert into stu2 values (null,'宝哥')";
    
    int result = sqlite3_exec(dbPoint, [insertSQL UTF8String], NULL, NULL, NULL);
    
    return [self isOperationResult:result alertText:@"添加"];

    
    
    
}

- (BOOL)deleteStu:(Student *)stu
{
    NSString *deleteSQL =  [NSString stringWithFormat:@"delete from stu2 where stu_id=%ld",stu.stu_id];
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    NSString *alertText = [NSString stringWithFormat:@"删除学号为%ld的数据",stu.stu_id];
    return [self isOperationResult:result alertText:@"删除一条数据"];
}

- (BOOL)deleteAll
{
    NSString *deleteSQL =  @"delete from stu2 where 1=1";
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"删除全部"];
}

- (BOOL)updateOldName:(NSString *)oldName newName:(NSString *)newName{
//    updata表名 set字段名 = 新值 where 字段名 = 旧值
    NSString *updateSQL = [NSString stringWithFormat:@"update stu2 set stu_name = '%@' where stu_name = '%@'",newName,oldName];
    int result = sqlite3_exec(dbPoint, [updateSQL UTF8String], NULL, NULL, NULL);
    
    return [self isOperationResult:result alertText:@"更新成功"];
}

- (__kindof NSArray *)selectAll
{
    
//    select字段名 字段名...from 表名 where 条件
    NSString *selectAll = @"select * from stu2";
    /**
     *  数据库指针
     SQL语句
     SQL语句的长度-1不限制他的长度
     替身，查询出的内容放入替身中并将替身返回
     */
//    替身指针
    sqlite3_stmt *stmt = NULL;
    int result = sqlite3_prepare(dbPoint, [selectAll UTF8String], -1, &stmt, NULL);
    NSMutableArray *stuArrray = [NSMutableArray array];
//    如果查询结果成功，
    if (result == SQLITE_OK) {
//        遍历替身内容
//        step查询替身中有没有其他数据，
//        当包含有其他数据时结果为SQLITE_ROW
//        不包含 SQLITE_DONE
        while (sqlite3_step(stmt) == SQLITE_ROW) {
//            循环体中，取对应的每一列数据
//            取出第一列数据，根据类型选择函数
            int stu_id = sqlite3_column_int(stmt, 0);
           const unsigned char *stu_name =  sqlite3_column_text(stmt, 1);
            Student *stu = [[Student alloc] init];
            stu.stu_id = stu_id;
            stu.stu_name = [NSString stringWithUTF8String:(const char *)stu_name];
            [stuArrray addObject:stu];
        }
    }
//    循环结束处理完数据后后销毁替身
    sqlite3_finalize(stmt);
    return stuArrray;
}



@end
